package com.py.framework.common;

import java.util.Map;

import org.springframework.util.CollectionUtils;

import com.py.framework.core.log.ExceptionLogger;
import com.py.framework.core.redis.bis.JedisBisManage;
import com.py.framework.core.utils.SerializingUtil;

import redis.clients.jedis.Jedis;

/**
 * 用户信息缓存辅助类
 * @author Leegern
 * @date   2018年4月16日
 */
public class UserCacheHelper {
	
	/**
	 * 保存用户信息
	 * @param jdToken    用户令牌
	 * @param userEntity 用户实体
	 */
	public static void putUserCache(byte[] jdToken, byte[] userEntity) {
		putUserFieldCache(jdToken, SerializingUtil.serialize(Constants.USER_KEY), userEntity);
	}
	
	/**
	 * 获取用户实体
	 * @param jdToken   用户令牌 
	 */
	public static byte[] getUserFromCache(byte[] jdToken) {
		return getUserFieldFromCache(jdToken, SerializingUtil.serialize(Constants.USER_KEY));
	}
	
	/**
	 * 保存用户所属部门信息
	 * @param jdToken    用户令牌
	 * @param office     部门实体
	 */
	public static void putUserOfficeCache(byte[] jdToken, byte[] office) {
		putUserFieldCache(jdToken, SerializingUtil.serialize(Constants.USER_OFFICE_KEY), office);
	}
	
	/**
	 * 获取用户所属部门信息
	 * @param jdToken   用户令牌 
	 */
	public static byte[] getUserOfficeFromCache(byte[] jdToken) {
		return getUserFieldFromCache(jdToken, SerializingUtil.serialize(Constants.USER_OFFICE_KEY));
	}
	
	/**
	 * 保存用户菜单资源信息
	 * @param jdToken    用户令牌
	 * @param menus      菜单资源
	 */
	public static void putUserMenuCache(byte[] jdToken, byte[] menus) {
		putUserFieldCache(jdToken, SerializingUtil.serialize(Constants.USER_MENU_KEY), menus);
	}
	
	/**
	 * 获取用户菜单资源
	 * @param jdToken   用户令牌 
	 */
	public static byte[] getUserMenuFromCache(byte[] jdToken) {
		return getUserFieldFromCache(jdToken, SerializingUtil.serialize(Constants.USER_MENU_KEY));
	}
	
	/**
	 * 保存用户资源数据
	 * @param jdToken    用户令牌
	 * @param resources  用户资源
	 */
	public static void putUserResourcesCache(byte[] jdToken, byte[] resources) {
		putUserFieldCache(jdToken, SerializingUtil.serialize(Constants.USER_RESOURCE_KEY), resources);
	}
	
	/**
	 * 获取用户资源数据
	 * @param jdToken    用户令牌
	 * @param resources  用户资源
	 */
	public static byte[] getUserResourcesFromCache(byte[] jdToken) {
		return getUserFieldFromCache(jdToken, SerializingUtil.serialize(Constants.USER_RESOURCE_KEY));
	}
	
	/**
	 * 保存用户属性信息
	 * @param jdToken    用户令牌 
	 * @param field      属性名
	 * @param value      属性值
	 */
	public static void putUserFieldCache(byte[] jdToken, byte[] field, byte[] value) {
		Jedis jedis = null;
		try {
			jedis = JedisBisManage.getJedis();
			jedis.hset(jdToken, field, value);
			jedis.expire(jdToken, Constants.SESSION_EXPIRE);
		} catch (Exception e) {
			ExceptionLogger.error(e);
		} finally {
			if (null != jedis) JedisBisManage.returnResource(jedis);
		}
	}
	
	/**
	 * 获取用户属性信息
	 * @param jdToken    用户令牌 
	 * @param field      属性名
	 */
	public static byte[] getUserFieldFromCache(byte[] jdToken, byte[] field) {
		Jedis jedis = null;
		byte[] result = null;
		try {
			jedis = JedisBisManage.getJedis();
			result = jedis.hget(jdToken, field);
			jedis.expire(jdToken, Constants.SESSION_EXPIRE);
		} catch (Exception e) {
			ExceptionLogger.error(e);
		} finally {
			if (null != jedis) JedisBisManage.returnResource(jedis);
		}
		return result;
	}
	
	
	/**
	 * 是否为有效用户
	 * @param jdToken 用户令牌
	 * @return true 是, false 否
	 */
	public static boolean isValidUser(byte[] jdToken) {
		boolean result =  false;
		Jedis   jedis  =  null;
		try {
			jedis = JedisBisManage.getJedis();
			result = jedis.exists(jdToken);
			// 如果存在,重置过期时间.
			if (result) {
				jedis.expire(jdToken, Constants.SESSION_EXPIRE);
			}
		} catch (Exception e) {
			ExceptionLogger.error(e);
		} finally {
			if (null != jedis) JedisBisManage.returnResource(jedis);
		}
		return result;
	}
	
	/**
	 * 是否为有权限访问资源
	 * @param jdToken  用户令牌
	 * @param resource 访问资源
	 * @return true 是, false 否
	 */
	@SuppressWarnings("unchecked")
	public static boolean hasValidResource(String jdToken, String resource) {
		boolean result =  false;
		Map<String, String> resources = null;
		byte[] bts = UserCacheHelper.getUserResourcesFromCache(SerializingUtil.serialize(jdToken));
		if (null != bts && bts.length > 0) {
			resources = (Map<String, String>) SerializingUtil.deserialize(bts);
			if (! CollectionUtils.isEmpty(resources) && resources.containsKey(resource)) {
				result = true;
			}
		} 
		return result;
	}
	
	/**
	 * 清空用户信息
	 * @param jdToken 用户令牌
	 */
	public static void clearUserCache(byte[] jdToken) {
		Jedis jedis = null;
		try {
			jedis = JedisBisManage.getJedis();
			jedis.del(jdToken);
		} catch (Exception e) {
			ExceptionLogger.error(e);
		} finally {
			if (null != jedis) JedisBisManage.returnResource(jedis);
		}
	}
}